home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TeX 1995 July
/
TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO
/
graphics
/
gnuplot
/
term
/
emxvga.trm
< prev
next >
Wrap
Text File
|
1993-05-11
|
4KB
|
234 lines
/* GNUPLOT - emxvga.trm */
/*
* Copyright (C) 1993
*
* Permission to use, copy, and distribute this software and its
* documentation for any purpose with or without fee is hereby granted,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation.
*
* Permission to modify the software is granted, but not the right to
* distribute the modified code. Modifications are to be distributed
* as patches to released version.
*
* This software is provided "as is" without express or implied warranty.
*
* This file is included by ../term.c.
*
* This terminal driver supports:
* vgal
* vesa
*
* AUTHORS
* Russell Lang
*
* send your comments or suggestions to (info-gnuplot@dartmouth.edu).
*
*/
/* VGA driver using EMX/GCC for DOS */
#include <graph.h>
#include <conio.h>
#include <dos.h>
int emx_startx, emx_starty;
int emx_xlast, emx_ylast;
int emx_color;
int emx_angle;
int emx_vmode = 0;
#ifdef EMXVESA
int emx_vesamode = G640x480x256;
#endif
#define EMXVGA_XMAX 640
#define EMXVGA_YMAX 480
#define EMXVGA_XLAST (EMXVGA_XMAX - 1)
#define EMXVGA_YLAST (EMXVGA_YMAX - 1)
#define EMXVGA_VCHAR FNT5X9_VCHAR
#define EMXVGA_HCHAR FNT5X9_HCHAR
#define EMXVGA_VTIC 4
#define EMXVGA_HTIC 4
#define EMXNUMCOLOR 15
static int emx_colors[EMXNUMCOLOR] = {7,8,2,3,4,5,9,14,12,15,13,10,11,1,6};
EMXVGA_init()
{
union REGS r;
r.h.ah = 0x0f;
_int86(0x10, &r, &r);
emx_vmode = r.h.al; /* save old video mode */
/* Get the screen size: */
if (!g_mode(G_MODE_VGA_L))
int_error("Couldn't select graphics mode",NO_CARET);
emx_xlast = g_xsize - 1;
term_tbl[term].xmax = emx_xlast + 1;
emx_ylast = g_ysize - 1;
term_tbl[term].ymax = emx_ylast + 1;
g_mode(G_MODE_OFF);
}
EMXVGA_graphics()
{
/* don't use g_mode() here - gmode(G_MODE_OFF) doesn't clean up */
union REGS r;
r.h.ah = 0x00;
r.h.al = 19; /* VGA 320x200x256 mode */
_int86(0x10, &r, &r);
}
EMXVGA_text()
{
/* don't use g_mode() here - gmode(G_MODE_OFF) doesn't clean up */
union REGS r;
int ch;
ch = getch();
r.h.ah = 0x00;
r.h.al = emx_vmode; /* old video mode */
_int86(0x10, &r, &r);
if (ch == 3)
int_error("Interrupt",NO_CARET);
}
EMXVGA_reset()
{
}
#ifdef EMXVESA
/* untested */
EMXVESA_options()
{
extern struct value *const_express();
extern double real();
if (!END_OF_COMMAND) {
if (almost_equals(c_token,"d$efault")) {
emx_vesamode = G640x480x256;
c_token++;
}
}
if (!END_OF_COMMAND) {
/* We have a vesa mode specified */
struct value a;
emx_vesamode = (int)real(const_express(&a));
}
sprintf(term_options,"%d",emx_vesamode);
}
EMXVESA_init()
{
if (!g_mode(emx_vesamode))
int_error("Couldn't select graphics mode",NO_CARET);
emx_xlast = g_xsize - 1;
term_tbl[term].xmax = emx_xlast + 1;
emx_ylast = g_ysize - 1;
term_tbl[term].ymax = emx_ylast + 1;
g_mode(GTEXT);
}
EMXVESA_graphics()
{
g_mode(emx_vesamode);
}
EMXVESA_text()
{
int ch;
ch = getch();
g_mode(GTEXT);
if (ch == 3)
int_error("Interrupt",NO_CARET);
}
EMXVESA_reset()
{
}
#endif
EMXVGA_linetype(linetype)
int linetype;
{
if (linetype >= 13)
linetype %= 13;
emx_color = emx_colors[linetype+2];
}
EMXVGA_move(x,y)
unsigned int x,y;
{
emx_startx = x;
emx_starty = y;
}
EMXVGA_vector(x,y)
unsigned int x,y;
{
g_line(emx_startx,emx_ylast-emx_starty,x,emx_ylast-y,emx_color);
emx_startx = x;
emx_starty = y;
}
int EMXVGA_text_angle(ang)
int ang;
{
emx_angle=ang;
return TRUE;
}
EMXVGA_putc(x,y,c,angle)
unsigned int x,y;
char c;
int angle;
{
int i,j,k;
unsigned int pixelon;
i = (int)(c) - 32;
for (j=0; j<FNT5X9_VBITS; j++) {
for (k=0; k<FNT5X9_HBITS; k++) {
pixelon = (((unsigned int)(fnt5x9[i][j])) >> k & 1);
if (pixelon) {
switch(angle) {
case 0 : g_set(x+k,y-j,emx_color);
break;
case 1 : g_set(x-j,y-k,emx_color);
break;
}
}
}
}
}
EMXVGA_put_text(x,y,str)
unsigned int x, y;
char *str;
{
int i;
switch(emx_angle) {
case 0 : y -= EMXVGA_VCHAR/2;
break;
case 1 : x += EMXVGA_VCHAR/2;
break;
}
for (i=0;str[i];i++) {
EMXVGA_putc(x,emx_ylast-y,str[i],emx_angle);
switch(emx_angle) {
case 0 : x+=EMXVGA_HCHAR ;
break;
case 1 : y+=EMXVGA_HCHAR ;
break;
}
}
}